#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>

int main(int argc, char const *argv[])
{
	// 1.申请系统键值 ftok
	key_t key = ftok(".", 1);
	if(key == -1)
	{
		perror("ftok error\n");
		return -1;
	}
	// 2.创建内核中的共享内存shmget
	int shmid = shmget(key, 1024, IPC_CREAT|IPC_EXCL|0666);
	if(shmid == -1 && errno==EEXIST) // 存在并报错，且错误为存在而错误
	{
		shmid = shmget(key, 1024, 0666); // 存在就打开
	}
	if(shmid == -1)
	{
		perror("shmget error\n");
		return -1;
	}
	// 3.映射该内存到应用层的堆空间 shmat
	char *shm_addr = (char *)shmat(shmid, NULL, 0);
	if(shm_addr == (void *)-1)
	{
		perror("shmat error\n");
		return -1;
	}
	// 4.数据的收发（通过指向堆空间的指针）
	while(1)
	{
		sleep(1);
		printf("接收到的数据%s\n", shm_addr);
		if(strcmp(shm_addr, "bye") == 0)
		{
			// printf("接收到的数据%s\n", shm_addr);
			break;
		}
	}
	// 5.解除映射，删除堆空间的共享内存 shmdt
	shmdt(shm_addr);
	// 6.删除内核空间中的共享内存 shmctl IPC_RMID
	shmctl(shmid, IPC_RMID, NULL);


	return 0;
}
